package com.itbaizhan.myproducer1;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//@Configuration
public class RabbitmqConfig {
    private final String EXCHANGE_NAME="my_topic_exchange";
    private final String QUEUE_NAME="my_queue";
    //创建交换机  注意导入Exchange的包，
    @Bean("bootExchange")  //spring容器中有很多交换机，加上id方便找到
    public Exchange getExchange(){
        return ExchangeBuilder
                .topicExchange(EXCHANGE_NAME)  //交换机类型
                .durable(true)  //是否持久化
                .build();
    }
    //创建队列
    @Bean("bootQueue")
    public Queue getQueue(){
        return new Queue(QUEUE_NAME);
    }

    //交换机绑定队列  @Qualifier是从spring容器中拿对象
    @Bean
    public Binding bingMessageQueue(@Qualifier("bootExchange") Exchange exchange,@Qualifier("bootQueue")Queue queue){
        return BindingBuilder
                .bind(queue)
                .to(exchange)
                .with("my_routing")
                .noargs();
    }
}
/*
* RabbitMQ消息投递的路径为：

生产者--->交换机--->队列--->消费者

在RabbitMQ工作的过程中，每个环节消息都可能传递失败，那么RabbitMQ是如何监听消息是否成功投递的呢？

确认模式（confirm）可以监听消息是否从生产者成功传递到交换机。
退回模式（return）可以监听消息是否从交换机成功传递到队列。
消费者消息确认（Consumer Ack）可以监听消费者是否成功处理消息。
* */